/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio;

import Negocio.Cola.Cola;
import Negocio.Cola.Contenedor;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Ivan
 */
public class PrimeroMejor extends MetodoBusqueda{
    private Cola<Hoja> abierto;
    private Contenedor<Hoja> cerrado;
    private Hoja primero_mejor;

    public PrimeroMejor() {
        abierto=new Cola<Hoja>();
        cerrado=new Contenedor<Hoja>();
        primero_mejor=null;
    }

    @Override
    public List<Estado> obtenerOptimo() {
        List<Estado> optimo=new ArrayList<Estado>();
        List<Hoja> camino=arbol.getCaminoOptimo();

        for(int i=0; i<camino.size();i++){
            optimo.add(camino.get(i).getEstado());
        }
        return optimo;
    }

    @Override
    public void procesar() {
//        cargarArbol(7);
        iniciarArbol();
        abierto.limpiar();
        cerrado.limpiar();
        Hoja raiz=arbol.getRaiz();
        abierto.insertar(raiz);
        
        
        do{
            try {
                primero_mejor = abierto.eliminar();
                            } catch (Exception ex) { }

//               if(!cerrado.contiene(primero_mejor)){
                arbol.cargarHijosDinamico(primero_mejor);
                cerrado.insertar(primero_mejor);

                List<Hoja> hijos=primero_mejor.getHijos();

                for(int i=0;i<hijos.size();i++){
                    abierto.insertarOrdenado(hijos.get(i));
                }

//               }
                

            
        }while(!primero_mejor.esEstadoFinal());

        List<Hoja> optimo=new ArrayList<Hoja>();
        Hoja temp=primero_mejor;
        temp.setEsCamino(true);
        optimo.add(0,temp);

       while(temp.getPadre()!=null){
           temp=temp.getPadre();
           optimo.add(0,temp);
           temp.setEsCamino(true);
       }
      
        arbol.setCaminoOptimo(optimo);
    }

    @Override
    public void obtenerMetrica(Hoja hoja) {
        hoja.getEstado().calcularMetrica(estadoFinal);
    }

    @Override
    public String toString() {
        return "Primero mejor";
    }

    @Override
    public List<Estado> resolucionAutomatica() {
        return this.obtenerOptimo();
    }

}
